package com.xiangwushuo.framework

import android.app.Application
import android.content.Context
import com.lib.common.helper.api.ApiHelper
import com.lib.common.helper.api.DomainConfig
import com.lib.common.helper.arouter.ARouterHelper
import com.lib.common.repository.common.ComSharePreHelper
import com.lib.common.repository.common.SpKeyInComSp
import com.lib.common.repository.datacenter.DataCenter
import com.lib.common.repository.user.UserInfoRepository
import com.lib.common.utils.ComUtils
import com.lib.common.widget.config.SmartRefreshLayoutConfigHelper
import com.lib.common.widget.config.TitleBarConfigHelper
import com.lib.framework.manager.ContextManager
import com.lib.framework.manager.RunningActivityManager
import com.lib.framework.manager.thread.bgThreadRun
import com.xiangwushuo.framework.activity.main.MainActivity
import com.xiangwushuo.framework.service.DaemonService

/**
 * Copyright (C), 2019-2019
 * FileName: AppInitHelper
 * Author: Kevin
 * Date: 2019-12-31 11:59
 * Description: 应用初始化辅助类，需要在启动应用初始化的模块，
 *              根据需要依次放到 initInStartActvity()、initOnlyInMainProcess()、initInAllProcessInApplication()，
 *              优先级顺序 initInStartActvity()、initOnlyInMainProcess()、initInAllProcessInApplication()，
 *              放在 initInMainActvityOnResume() 不满足需要，才能放到 initInStartActvity()，
 *              放在 initInStartActvity() 不满足需要，才能放到 initOnlyInMainProcess()，
 *              放在 initOnlyInMainProcess() 不满足需要，才能放到 initInAllProcessInApplication()。
 * History:
 * <author> <time> <version> <desc>
 * 作者姓名 修改时间 版本号 描述
 */
class AppInitHelper {

    companion object {

        /**
         * 同意协议之后 的应用初始化 是否完成了
         */
        private var sIsInitAfterAgreedAgreementFinish = false

        /**
         * 在启动页面初始化，进程在后台被回收，然后自动重新创建，不会走这个接口，
         * 只会启动 application，然后直接启动被杀掉时的页面。
         * 所以 这里放的初始化 必须不是必要的初始化，如果时必要初始化就放到
         * initOnlyInMainProcess()、initInAllProcessInApplication()
         */
        fun initInStartActvity(context: Context) {
            // 放在主线程的初始化

            bgThreadRun {
                // 放在线程的初始化
                if (DataCenter.isLogin()) {
                    UserInfoRepository.getInstance().getUserInfoFromServer()
                }
            }
        }

        /**
         * 主进程需要的在 Application 中的 初始化，只有主进程会初始化
         */
        fun initOnlyInMainProcess(application: Application) {
            // 放在主线程的初始化
            // 启动 守护进程 service
            DaemonService.startDaemonService(application)

            ARouterHelper.init(ContextManager.applicationContext)

            if (ComSharePreHelper.getBoolean(SpKeyInComSp.SP_KEY_AGREED_AGREEMENT, false)) {
                // 需要在同意协议之后才能进行的初始化，放到下面这个函数里面
                initAfterAgreedAgreement(application)
            }

            bgThreadRun {
                // 放在线程的初始化

                // 退出登陆需要执行的操作
                ComUtils.sLogoutCallList.add {

                }

                // 退出登陆页面重置函数
                ComUtils.sLogoutPageResetCall = {
                    RunningActivityManager.finishAllActivity(MainActivity::class.java.canonicalName)
                }
            }
        }

        /**
         * 同意协议之后 的应用初始化
         */
        fun initAfterAgreedAgreement(application: Application) {
            if (sIsInitAfterAgreedAgreementFinish) return
            sIsInitAfterAgreedAgreementFinish = true

            // 放在主线程的初始化


            bgThreadRun {
                // 放在线程的初始化

            }
        }

        /**
         * 所有进程都需要的在 Application 中的 初始化，每一个进程都会初始化一遍
         */
        fun initInAllProcessInApplication(application: Application) {
            // 放在主线程的初始化
            DomainConfig.initDomain() // 域名配置初始化
            ApiHelper.initNetworkManager() // 初始化网络管理器
            SmartRefreshLayoutConfigHelper.globalConfig(application) // SmartRefreshLayout 全局配置
            TitleBarConfigHelper.globalConfig(application) // TitleBar 全局配置

            bgThreadRun {
                // 放在线程的初始化
            }
        }

        /**
         * 登陆之后的初始化
         */
        fun initInLogin() {
            // 放在主线程的初始化


            bgThreadRun {
                // 放在线程的初始化
            }
        }
    }
}